package com.example.demo.result;

import com.example.demo.common.constant.CommonConstants;
import lombok.*;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @Author:qh
 * @Description:响应实体信息封装
 * @Date:2023/4/24 1、@Accessors属性说明：
 * 1.fluent属性
 * 不写默认为false,当该值为true时,对应的getter方法前面就没有get,setter方法就不会有set
 * false:s.getName()  true:s.name()
 * 2.chain属性
 * 不写默认为false,当该值为true时,对应字段的setter方法调用后,会返回该对象
 * 3.prefix属性
 *  该属性是一个字符串数组,当该数组有值时,表示忽略字段中对应的前缀,生成对应的getter和setter方法
 *   栗子:
 *      String xxName;int xxAge;
 *      普通:生成setXxName/setXxAge
 *      标签:生成setName/setAge
 *
 */
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)//作用：当属性字段在生成getter方法和setter方法时,做一些相关的设置;作用在类上时,对全部字段起作用,也可以单独作用在字段上,只对该字段有效；
public class R<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    @Setter
    @Getter
    private int code;

    @Setter
    @Getter
    private String msg;

    @Setter
    @Getter
    private T data;

    public static <T> R<T> ok() {
        return restResult(null, CommonConstants.SUCCESS, CommonConstants.SUCCESS_STR);
    }

    public static <T> R<T> ok(T data) {
        return restResult(data, CommonConstants.SUCCESS, CommonConstants.SUCCESS_STR);
    }

    public static <T> R<T> ok(T data, String msg) {
        return restResult(data, CommonConstants.SUCCESS, msg);
    }

    public static <T> R<T> failed() {
        return restResult(null, CommonConstants.FAIL, null);
    }

    public static <T> R<T> failed(T data) {
        return restResult(data, CommonConstants.FAIL, null);
    }

    public static <T> R<T> failed(String msg) {
        return restResult(null, CommonConstants.FAIL, msg);
    }

    public static <T> R<T> failed(T data, String msg) {
        return restResult(data, CommonConstants.FAIL, msg);
    }

    public static <T> R<T> restResult(T data, int code, String msg) {
        R<T> apiResult = new R<>();
        apiResult.setCode(code);
        apiResult.setData(data);
        apiResult.setMsg(msg);
        return apiResult;
    }
}
